%% 遗传算法优化Genetic algorithm
clear,clc
%% 参数初始化
f=@(x)1/12*sum(x.^4)-1/2*sum(x.^2)+sum(abs(x-4));% 目标函数
lb=-1e2*ones(1,6);ub=1e2*ones(1,6);%变量范围
n=length(lb);% 变量个数
%% 遗传算法计算过程
mumb=50;% 种群大小
mumb1=10;% 优异数量
mn=1e3;% 最大迭代次数
cross0=3;% 交叉基因个数
mumb2=20;% 交叉数
mumb3=20;% 变异数
gen0=3;% 变异基因个数
gama0=1;% 变异程度迭代变化参数
x0=zeros(mumb,n);% 种群初始化
mn1=10;% 遗传算法计算次数
result1=zeros(mumb,1);% 计算适应度
result_final=[];% 最终结果
for i=1:mn1
    tic
    for i1=1:mumb
        x0(i1,:)=lb+(ub-lb).*rand(1,n);
    end
    x1=x0;% x1用来迭代计算
    for i1=1:mumb
        result1(i1)=f(x1(i1,:));
    end
    gama=gama0;
    for i1=1:mn % 迭代计算
        [result3,k]=sort(result1);
        xk=x1(k,:);
        xk1=xk(1:mumb1,:);% 找到优异个体
        % 交叉操作
        xk0=zeros(mumb2+mumb3,n);
        for i2=1:mumb2
            m1=floor(mumb1*rand()+1);
            m2=floor(mumb1*rand()+1);
            xk2=xk1(m1,:);xk3=xk1(m2,:);
            for i3=1:cross0 % 交叉过程
                m3=floor(n*rand()+1);
                temp=xk2(m3);
                xk2(m3)=xk3(m3);
                xk3(m3)=temp;
            end
            xk0(i2,:)=xk2;
        end
        % 变异操作，此处可保持变异程度不变，或者令变异程度随迭代增加减小
        for i2=1:mumb3
            m1=floor(mumb1*rand()+1);
            xk0(mumb2+i2,:)=xk1(m1,:);
            for i3=1:gen0
                m2=floor(n*rand()+1);
                z=-1+2*rand();
                temp=xk1(m1,m2)+z*gama*(ub(m2)-lb(m2))/4;
                if(temp>ub(m2))
                    temp=xk1(m1,m2)+1/2*(ub(m2)-xk1(m1,m2));
                elseif(temp<lb(m2))
                    temp=xk1(m1,m2)+1/2*(lb(m2)-xk1(m1,m2));
                end
                xk0(mumb2+i2,m2)=temp;
            end
        end
        x1=[xk1;xk0];
        for i2=1:mumb
            result1(i2)=f(x1(i2,:));
        end
        gama=gama*gama;
    end
    toc
    result_final=[result_final;[result1,x1]];
end